/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	pump.c
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-11-20
**	Function List： 
**  History:         
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/
#include "pump.h"
#include "system_cfg.h"


/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
#define FLASH_SIZE_PUMP_CFG	(sizeof(pump_cfg_t)*PUMP_NUM)
/*
*********************************************************************************************************
*                                              	结构体定义
*********************************************************************************************************
*/

 
/*
*********************************************************************************************************
*                                              	函数原型声明
*********************************************************************************************************
*/
static uint8_t	get_pump_index(pump_id_t id);

static uint32_t	resort_board_value(uint32_t data);
/*
*********************************************************************************************************
*                                              	全局变量定义
*********************************************************************************************************
*/
uint32_t 	g_board_a_io;
uint32_t 	g_board_b_io;

OS_MUTEX	g_board_a_mutex;
OS_MUTEX	g_board_b_mutex;


pump_t pump_array[PUMP_NUM];


/*
*********************************************************************************************************
*                                              	模块静态变量定义
*********************************************************************************************************
*/
static uint8_t pump_func(void* para);
/*
*********************************************************************************************************
*                                              	函数定义
*********************************************************************************************************
*/
pump_err_t pump_init(void)
{
//	OS_ERR err;
//	
//	OSMutexCreate(&g_board_a_mutex, "board a mutex", &err);
//	if(OS_ERR_NONE != err)
//	{
//		return PUMP_ERR_INIT;
//	}
//	
//	OSMutexCreate(&g_board_b_mutex, "board b mutex", &err);
//	if(OS_ERR_NONE != err)
//	{
//		return PUMP_ERR_INIT;
//	}
//	
//	pump_t* p_pump = NULL;
//	for(uint8_t i=0; i<PUMP_NUM; i++)
//	{
//		p_pump = &pump_array[i];
//		p_pump->pump_id = i;
//		p_pump->p_cfg=&m_product_cfg.m_pump_cfg[i];
////		if(p_pump->p_cfg->CAN_ID == IO_BOARD1_ID)
////		{
//			p_pump->board_value = &g_board_a_io;
//			p_pump->p_mutex = &g_board_a_mutex;
////		}else if(p_pump->p_cfg->CAN_ID == IO_BOARD2_ID)
////		{
////			p_pump->board_value = &g_board_b_io;
////			p_pump->p_mutex = &g_board_b_mutex;				
////		}
////		else
////			p_pump->p_cfg->enable = 0;
//		if(p_pump->p_cfg->channel > PUMP_CH_32)
//			p_pump->p_cfg->enable = 0;
//		p_pump->on_cnt = 0;	//开机默认关闭
//	}
//	return PUMP_ERR_NONE;
//	
}


uint8_t pump_on(pump_id_t id, void* p_task_cb)
{	
////	if(p_task_cb==NULL||((schedule_cb_t*)p_task_cb)->current_status==MOD_STATUS_DISABLE)
////		return 0;
//	uint8_t pump_index = get_pump_index(id);
//	pump_t* p_pump = &pump_array[pump_index];
//	if(p_pump->p_cfg->enable==PUMP_DISABLE)
//		return 1;
//	act_t* p_act = act_malloc();
//	if(p_act == NULL)
//	{
//		return 1;
//	}
//	memset(p_act, 0, sizeof(act_t));	
//	
//	p_act->p_task_cb = p_task_cb;
//	p_act->flag = 1;			//均是立刻释放
//	p_act->arg[ACT_PARA_DEVICE_INDEX] = (uint32_t)p_pump;
//	if(p_pump->p_cfg->logic_reverse)
//		p_act->arg[ACT_PARA_ONOFF_INDEX]	= IO_OFF;
//	else
//		p_act->arg[ACT_PARA_ONOFF_INDEX]	= IO_ON;
//	p_act->func = pump_func;

//	schedule_cb_t* p_task = p_task_cb;
//	ccp_push(p_task->p_send_list, p_act);
	return 0;	
}


uint8_t pump_off(pump_id_t id, void* p_task_cb)
{
////	if(p_task_cb==NULL||((schedule_cb_t*)p_task_cb)->current_status==MOD_STATUS_DISABLE)
////		return 0;
//	uint8_t pump_index = get_pump_index(id);
//	pump_t* p_pump = &pump_array[pump_index];
//	if(p_pump->p_cfg->enable==PUMP_DISABLE)
//		return 1;
//	act_t* p_act = act_malloc();
//	if(p_act == NULL)
//	{
//		return 1;
//	}
//	memset(p_act, 0, sizeof(act_t));	
//	

//	
//	p_act->p_task_cb = p_task_cb;
//	p_act->flag = 1;			//均是立刻释放
//	p_act->arg[ACT_PARA_DEVICE_INDEX] = (uint32_t)p_pump;
//	if(p_pump->p_cfg->logic_reverse)
//		p_act->arg[ACT_PARA_ONOFF_INDEX]	= IO_ON;
//	else
//		p_act->arg[ACT_PARA_ONOFF_INDEX]	= IO_OFF;
//	p_act->func = pump_func;

//	schedule_cb_t* p_task = p_task_cb;
//	ccp_push(p_task->p_send_list, p_act);
	return 0;
}


static uint8_t pump_func(void* para)
{	
//	OS_ERR err;
//	act_t * p_act=(act_t*) para;
//	pump_t* p_pump = (pump_t*)p_act->arg[ACT_PARA_DEVICE_INDEX];
//	uint32_t param=p_act->arg[ACT_PARA_ONOFF_INDEX];
//	/* 获取修改权限 */
//	OSMutexPend(p_pump->p_mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
//	if(OS_ERR_NONE != err)
//	{
//		Trace_Log("pump %d on mutex failed!\n", p_pump->pump_id);
//		return 1;
//	}
//	uint32_t board_value = *(p_pump->board_value);
//	
//	if(param == IO_ON)		//开泵
//	{
//		/* 当前已打开 */
//		if(p_pump->on_cnt)
//		{
//		//	Trace_Log("pump %d already on, cnt %d!\n", p_pump->pump_id, p_pump->on_cnt);
//			p_pump->on_cnt++;		
//		}else{
//			/* 修改值 */
//			board_value = board_value|(1<<(p_pump->p_cfg->channel));
//			*(p_pump->board_value) = board_value;
//			p_pump->on_cnt++;	
//			fetp_io_frame(p_pump->p_cfg->CAN_ID, resort_board_value(board_value));
//		}
//	
//	}else{
//		if(p_pump->on_cnt == 0)		//已经关闭
//		{
////			Trace_Log("pump %d alread off!\n", p_pump->pump_id);	
//		}else if(p_pump->on_cnt == 1)	//需要发送关闭
//		{
//			/* 修改值 */
//			board_value = board_value&(~(1<<(p_pump->p_cfg->channel)));
//			*(p_pump->board_value) = board_value;
//			p_pump->on_cnt = 0;			
//			fetp_io_frame(p_pump->p_cfg->CAN_ID, resort_board_value(board_value));
//		}else /* 多次打开，等待最终关闭 */
//		{
//	//		Trace_Log("pump %d used by other, cnt %d!\n", p_pump->pump_id, p_pump->on_cnt);	
//			p_pump->on_cnt--;		
//		}
//	
//	}	
//	/* 释放修改权限 */
//	OSMutexPost(p_pump->p_mutex, OS_OPT_POST_NONE, &err);		
	
	return ACT_RLT_POST|ACT_RLT_DEL;
}


static uint32_t	resort_board_value(uint32_t data)
{
	return ((data&0xFF)<<24) 
				| (((data>>8)&0xFF)<<16)
				| (((data>>16)&0xFF)<<8)
				| (((data>>24)&0xFF));
}


static uint8_t	get_pump_index(pump_id_t id)
{
	pump_t* p_pump;
	
	for(uint8_t i=0; i<PUMP_NUM; i++)
	{
		p_pump = &pump_array[i];
		if(p_pump->pump_id == id)
		{
			return i;
		}
	}
	return PUMP_NOT_FIND;
}


static uint8_t get_pump_id(uint16_t io_board_id, uint8_t io_ch)
{
	pump_t* p_pump;
	
	for(uint8_t i=0; i<PUMP_NUM; i++)
	{
		p_pump = &pump_array[i];
		if((p_pump->p_cfg->CAN_ID == io_board_id) && (p_pump->p_cfg->channel == io_ch))
		{
			return p_pump->pump_id;
		}
	}
	return PUMP_NOT_FIND;		
}
uint8_t pump_set(pump_id_t id, pump_io_flag_t flag)
{
//	if(id > PUMP_NUM)
//		return PUMP_ERR_NONE;
//	pump_t * p_pump=&pump_array[id];
////	for(uint8_t i=0;i<PUMP_NUM;i++){
////		if(pump_array[i].p_cfg->channel==id)
////		{p_pump=&pump_array[i];
////			break;}
////	}
//	uint32_t board_value = *(p_pump->board_value);
//	if(flag==IO_ON)
//	{
//		board_value = board_value|(1<<(p_pump->p_cfg->channel));
//	}
//	else{
//		board_value = board_value&(~(1<<(p_pump->p_cfg->channel)));
//	}
//	*(p_pump->board_value) = board_value;
//	if(p_pump!=NULL)
//		fetp_io_frame(p_pump->p_cfg->CAN_ID, resort_board_value(board_value));
	return PUMP_ERR_NONE;
}